import {Base} from '../../utils/base.js';

class Cart extends Base {

  constructor(){
    super(); 
    this._storageKey = 'cart';
  }

  /**
   * 添加购物车
   * 从缓存中取数据，判断当前数据是否已经存在购物车
   * 如果没有新增数据
   * 如果有，则数量+1
   * @param {object} item 
   * @param {int} count 
   */
  add(item, count) {
    // 从本地缓存获取购物车数据
    var storageData = this.getCartDataFromLocal();
    // 判断需要添加购物车的数据是否在缓存中
    var isHasInfo = this._isHasItemInfo(item.id, storageData);

    if (isHasInfo.index == -1) {
      // 如果不是，更新缓存数据
      item.counts = count;
      item.selectStatus = true;
      storageData.push(item);
    }else {
      // 如果是，数量+1
      storageData[isHasInfo.index].counts += count;
    }
    wx.setStorageSync(this._storageKey, storageData)
  }

  // 获取购物车商品数量接口
  getCartProductCount(select) {
    var res = wx.getStorageSync(this._storageKey),
    count = 0;
    if (res) {
      for (let i=0; i < res.length; i++){
        if(select) {
          if (res[i].selectStatus){
            count += res[i].counts;
          }
        }
        else{
          count += res[i].counts;
        }
      }
    }
    return count;
  }

  /**
   * 从缓存中取出购物车数据
   */ 
  getCartDataFromLocal(flag) {
    var res = wx.getStorageSync(this._storageKey);
    if (!res){
      return [];
    }

    // 只返回勾选的产品信息
    if (flag){
      var newRes = [];
      for(let i=0; i < res.length;i++){
        if (res[i].selectStatus){
          newRes.push(res[i]);
        }
      }
      res = newRes;
    }
    return res;
  }

  /**
   * 获取商品ID对应的索引
   * @param {*} id 
   * @param {*} data 
   */
  getCartProductIndex(id, data) {
    for (let i=0; i<data.length;i++){
      if (data[i].id == id){
        return i;
      }
    }
    return -1;
  }

  /**
   * 修改商品数量
   * @param {*} index 
   * @param {*} count 
   */
  _changeCartProductCounts(index, count){
    // 获取购物车数据
    var cartData = wx.getStorageSync(this._storageKey),
    num = count < 0 ? 2 : 1;
    if (cartData[index].counts >= num){
      cartData[index].counts += count;
      wx.setStorageSync(this._storageKey, cartData);
      return true;
    }
    return false;
  }

  /**
   * 数量+1
   * @param {*} index 
   */
  addCounts(index) {
    return this._changeCartProductCounts(index, 1);
  }

  /**
   * 数量-1
   * @param {*} index 
   */
  reduceCounts(index) {
    return this._changeCartProductCounts(index, -1);
  }

  /**
   * 判断item是否在购物车列表中
   * @param {int} id 
   * @param {array} storageData 
   */
  _isHasItemInfo(id, storageData) {
    var item, 
    result = {
      index : -1
    };
    for (let i=0; i < storageData.length; i++){
       item = storageData[i];
       if (item.id == id){
         return {
           index: i,
           data: item
         };
         break;
       }
    }
    return result;
  }

  /**
   * 删除购物车中指定ID的商品
   * @param {*} ids 
   */
  delete(ids) {
    if(!(ids instanceof Array)){
      ids=[ids];
    }
    var cartData=this.getCartDataFromLocal();

    for(let i=0; i< ids.length; i++){
      var hasInfo = this._isHasItemInfo(ids[i], cartData);
      if (hasInfo.index != -1){
        cartData.splice(hasInfo.index, 1);
      }
    }
    wx.setStorageSync(this._storageKey,cartData);
  }
}

export {Cart};